using System;
using System.Linq;
using System.Transactions;
using System.Collections.Generic;

using PMServiceDesk.DataAccess;
using PMServiceDesk.DataType;
using PMServiceDesk.Parameters.Constantes;
using PMServiceDesk.Utils.ManejoDatos;

namespace PMServiceDesk.BusinessLogic
{
    public class LineaBaseLogic
    {
        #region Variables

        private LineaBaseData _lineaBaseData;

        #endregion

        #region Constructores

        public LineaBaseLogic()
        {
            _lineaBaseData = new LineaBaseData();
        }

        #endregion

        #region Metodos

        public LineaBaseType CargarPorId(string id)
        {
            _lineaBaseData.FiltrarPorId(id);

            return _lineaBaseData.Cargar();
        }

        public LineaBaseType CargarVigentePorProyecto(string proyectoId)
        {
            _lineaBaseData.FiltrarPorProyectoId(proyectoId);
            _lineaBaseData.FiltrarPorEstadoId(Estados.LineaBase_Vigente);

            return _lineaBaseData.Cargar();
        }

        public void Grabar(LineaBaseType lineaBase)
        {
            _lineaBaseData.Grabar(lineaBase);
        }

        public List<LineaBaseType> CargarExplorador(string proyectoId)
        {
            if(proyectoId != "") _lineaBaseData.FiltrarPorProyectoId(proyectoId);

            return _lineaBaseData.CargarListaVista();
        }

        public bool ImportarLineaBase(LineaBaseType lineaBase)
        {
            DocumentoDigitalType archivo = new DocumentoDigitalLogic().CargarVistaPorId(lineaBase.DocumentoDigitalId);

            lineaBase.Nombre = archivo.Nombre;
            lineaBase.EstadoId = Estados.LineaBase_Vigente;
            lineaBase.FechaRegistro = DateTime.Now;

            LineaBaseType lineaBaseActual = this.CargarVigentePorProyecto(lineaBase.ProyectoId);
            LineaBaseDetalleLogic logicDetalle = new LineaBaseDetalleLogic();

            List<LineaBaseImportarType> importacion = new LineaBaseImportarLogic().Importar(lineaBase.ProyectoId, archivo.FileServer);

            List<KeyValuePair<string, string>> jefesProyecto = SoporteLogic.JefesProyectoPorProyecto(lineaBase.ProyectoId);

            using (TransactionScope transaccion = new TransactionScope())
            {
                this.Grabar(lineaBase);

                if (lineaBaseActual != null)
                {
                    lineaBaseActual.EstadoId = Estados.LineaBase_Registrado;
                    this.Grabar(lineaBaseActual);
                }
                
                foreach (LineaBaseImportarType lineaImportar in importacion)
                    logicDetalle.GrabarImportarLineaBase(lineaBase, lineaImportar, jefesProyecto);

                new ProyectoLogic().RegistrarFechasLineaBase(lineaBase.ProyectoId, importacion);

                transaccion.Complete();
            }

            return true;
        }

        #endregion
    }
}
